//  1.事件循环？宏任务？微任务？
/**
 * 宏任务（task）包括：script(整体代码)、setTimeout, setInterval, setImmediate、I/O、UI rendering ajax请求不属于宏任务，js线程遇到ajax请求，会将请求交给对应的http线程处理，一旦请求返回结果，就会将对应的回调放入宏任务队列，等请求完成执行。
 * 微任务（job）包括：process.nextTick、Promise、Object.observe(已废弃)、MutationObserver(html5新特性)。
 * 这些我们可以理解为它们在执行上下文中都是可执行代码，会立即执行，只不过会将各自的回调函数放入对应的任务队列中（宏任务微任务），也就相当于一个调度者。
 * 事件循环的执行机制： 循环首先从宏任务开始，遇到script，生成执行上下文，开始进入执行栈，可执行代码入栈，依次执行代码，调用完成出栈。 执行过程中遇到上边提到的调度者，会同步执行调度者，由调度者将其负责的任务（回调函数）放到对应的任务队列中，直到主执行栈清空，然后开始执行微任务的任务队列。微任务也清空后，再次从宏任务开始，一直循环这一过程。
 */

//  2.promise？async/await？
/**
 * promise通过使用then的链式调用实现异步函数嵌套。
 * async就是Genarator函数（生成器函数）的语法糖。await等价于yield。
 */

//  3.fetch？ajax？axios？
/**
 * fetch：是原生js，没有使用XMLHttpRequest对象
	1.语法简洁，更加语义化
	2.基于标准 Promise 实现，支持 async/await
	3.同构方便，使用 [isomorphic-fetch]
	4.更加底层，提供的API丰富（request, response）
	5.脱离了XHR，是ES规范里新的实现方式
 * 
 * axios：对原生XHR的封装，支持 Promise API
	1.从浏览器中创建 XMLHttpRequest
	2.支持 Promise API
	3.客户端支持防止CSRF
	4.提供了一些并发请求的接口（重要，方便了很多的操作）
	5.从 node.js 创建 http 请求
	6.拦截请求和响应
	7.转换请求和响应数据
	8.取消请求
	9.自动转换JSON数据
 * 
 * ajax：XMLHttpRequest对象，就会出现回调地狱。
	1.本身是针对MVC的编程,不符合现在前端MVVM的浪潮
	2.基于原生的XHR开发，XHR本身的架构不清晰。
	3.JQuery整个项目太大，单纯使用ajax却要引入整个JQuery非常的不合理（采取个性化打包的方案又不能享受CDN服务）
	4.不符合关注分离（Separation of Concerns）的原则
    5.配置和调用方式非常混乱，而且基于事件的异步模型不友好。
 */

//  4.js防抖与节流
/**
 * 函数防抖：将几次操作合并为一此操作进行。原理是维护一个计时器，规定在delay时间后触发函数，但是在delay时间内再次触发的话，就会取消之前的计时器而重新设置。这样一来，只有最后一次操作能被触发。
 * function debounce(fn, wait) {
    var timeout = null;
    return function() {
        if(timeout !== null) 
                clearTimeout(timeout);
        timeout = setTimeout(fn, wait);
    }
  }
  // 处理函数
  function handle() {
    console.log(Math.random()); 
  }
  // 滚动事件
  window.addEventListener('scroll', debounce(handle, 1000));
 * 函数节流：使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。
 * function throttle (fn, wait) {
  	let timeoutId = null
  	return function () {
    	let context = this
    	if (!timeoutId) {
      		timeoutId = setTimeout(() => {
        	fn.apply(context, arguments)
        	timeoutId = null
      	}, wait)
    	}
  	  }
	}
 * 区别：函数节流不管事件触发有多频繁，都会保证在规定时间内一定会执行一次真正的事件处理函数，而函数防抖只是在最后一次事件后才触发一次函数。比如在页面的无限加载场景下，我们需要用户在滚动页面时，每隔一段时间发一次 Ajax 请求，而不是在用户停下滚动页面操作时才去请求数据。这样的场景，就适合用节流技术来实现。
 */

//  5.数组方法
/**
 * 
 */

//  6.ES6语法
/**
 * 
 */

//  7.this
/**
 * 
 */